package com.fjwt.gz.mgr.ctrl.agent;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fjwt.gz.core.model.ApiRes;
import com.fjwt.gz.db.base.BaseAgentApp;
import com.fjwt.gz.db.dto.AgentAppDTO;
import com.fjwt.gz.db.vo.AgentAppVO;
import com.fjwt.gz.mgr.ctrl.CommonCtrl;
import com.fjwt.gz.service.impl.AgentAppService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 * 小程序管理
 * @Author: Will
 * @Date: 2023-12-29
 * @Version: 1.0
 */
@RestController
@Slf4j
@RequestMapping("/api/agent/app")
public class AgentAppController extends CommonCtrl {
    @Autowired
    private AgentAppService agentAppService;

    /**
     * 查询小程序列表
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LITE_INFO', 'ENT_MP_INFO', 'ENT_LITE_INFO_LIST', 'ENT_MP_INFO_LIST')")
    @GetMapping
    public ApiRes page() {
        AgentAppDTO agentAppDTO = getObject(AgentAppDTO.class);
        log.info("pc端查询小程序列表，请求地址：/api/agent/app，请求参数：{}", JSONUtil.toJsonStr(agentAppDTO));
        IPage<AgentAppVO> page = agentAppService.page(getIPage(), agentAppDTO);
        log.info("pc端查询小程序列表，请求地址：/api/agent/app，返回参数：{}", JSONUtil.toJsonStr(page));
        return ApiRes.page(page);
    }

    /**
     * 新增小程序
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LITE_INFO_ADD', 'ENT_MP_INFO_ADD')")
    @PostMapping
    public ApiRes add() {
        AgentAppDTO agentAppDTO = getObject(AgentAppDTO.class);
        BaseAgentApp baseAgentApp = getObject(BaseAgentApp.class);
        log.info("pc端新增小程序，请求地址：/api/agent/app，请求参数：{}，{}", JSONUtil.toJsonStr(agentAppDTO),  JSONUtil.toJsonStr(baseAgentApp));
        agentAppService.add(agentAppDTO, baseAgentApp);

        return ApiRes.ok();
    }

    /**
     * 修改小程序
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LITE_INFO_EDIT','ENT_MP_INFO_EDIT')")
    @PostMapping("/update")
    public ApiRes update() {
        AgentAppDTO agentAppDTO = getObject(AgentAppDTO.class);
        BaseAgentApp baseAgentApp = getObject(BaseAgentApp.class);
        log.info("pc端修改小程序，请求地址：/api/agent/app/update，请求参数：{}，{}", JSONUtil.toJsonStr(agentAppDTO),  JSONUtil.toJsonStr(baseAgentApp));
        agentAppService.update(agentAppDTO, baseAgentApp);
        return ApiRes.ok();
    }

    /**
     * 小程序详情
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_LITE_INFO_EDIT', 'ENT_MP_INFO_EDIT')")
    @PostMapping("/detail")
    public ApiRes detail() {
        AgentAppDTO agentAppDTO = getObject(AgentAppDTO.class);
        log.info("pc端小程序详情，请求地址：/api/agent/app/detail，请求参数：{}", JSONUtil.toJsonStr(agentAppDTO));
        AgentAppVO detail = agentAppService.detail(agentAppDTO);
        log.info("pc端小程序详情，请求地址：/api/agent/app/detail，返回参数：{}", JSONUtil.toJsonStr(detail));
        AgentAppVO data = new AgentAppVO();
        BeanUtils.copyProperties(detail, data);
        return ApiRes.ok(data);
    }

    /**
     * 机构小程序列表 （渠道管理-新建）
     * @return
     */
    @PostMapping("/list")
    public ApiRes list() {
        AgentAppDTO agentAppDTO = getObject(AgentAppDTO.class);
        log.info("pc端小程序列表，请求地址：/api/agent/app/list，请求参数：{}", JSONUtil.toJsonStr(agentAppDTO));
        List<AgentAppVO> agentAppVOList = agentAppService.getAgentNoApp(agentAppDTO.getAgentNo(), agentAppDTO.getType(), agentAppDTO.getAppId());
        log.info("pc端小程序列表，请求地址：/api/agent/app/list，返回参数：{}", JSONUtil.toJsonStr(agentAppVOList));
        return ApiRes.ok(agentAppVOList);
    }

    /**
     * 机构小程序及上级列表
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_ACTIVITY_LIST_INFO_VIEW')")
    @PostMapping("/listAndTopList")
    public ApiRes listAndTopList() {
        AgentAppDTO agentAppDTO = getObject(AgentAppDTO.class);
        log.info("pc端小程序列表，请求地址：/api/agent/app/listAndTopList，请求参数：{}", JSONUtil.toJsonStr(agentAppDTO));
        List<AgentAppVO> agentAppVOList = agentAppService.getAgentNoAndTopApp(agentAppDTO.getAgentNo(), agentAppDTO.getType(), agentAppDTO.getAppId());
        log.info("pc端小程序列表，请求地址：/api/agent/app/listAndTopList，返回参数：{}", JSONUtil.toJsonStr(agentAppVOList));
        return ApiRes.ok(agentAppVOList);
    }

    /***
     *机构管理 - 小程序管理 -小程序banner配置 - 小程序列表
     */
    @PostMapping("/getList")
    public ApiRes getList(){
        AgentAppDTO agentAppDTO = getObject(AgentAppDTO.class);
        log.info("小程序列表，请求地址：/api/agent/app/getList，请求参数：{}", JSONUtil.toJsonStr(agentAppDTO));
        String currentAgentNo = getCurrentUser().getSysUser().getBelongInfoId();
        agentAppDTO.setCurrentAgentNo(currentAgentNo);
        List<AgentAppVO> list = agentAppService.getList(agentAppDTO);
        List<AgentAppVO> vos = List.copyOf(list);
        log.info("小程序列表，请求地址：/api/agent/app/getList，返回参数：{}", JSONUtil.toJsonStr(list));
        return ApiRes.ok(vos);
    }

}